/****************************************Copyright (c)*************************
**                               版权所有 (C), 2020-2030, 零匙科技
**
**                                 https://www.0k.com/
**
**--------------文件信息-------------------------------------------------------
**文   件   名: system.c
**描        述: ble数据处理函数
**使 用 说 明 : 用户无需关心该文件实现内容
**
**
**--------------当前版本修订---------------------------------------------------
** 版  本: v1.0.0
** 日　期: 2022年02月15日
** 描　述: 1:协议初版
** 作  者：zouchuan
**-----------------------------------------------------------------------------
******************************************************************************/


#ifndef _LEOKEY_BLE_SYSTEM_H_
#define _LEOKEY_BLE_SYSTEM_H_


#include "leokey_ble.h"


#ifdef SUPPORT_MCU_RTC_CHECK
//时间结构体
typedef struct
{
    unsigned char hour;
    unsigned char min;
    unsigned char sec;
    //公历年月日周
    unsigned short w_year;
    unsigned char w_month;
    unsigned char w_date;
    //unsigned char  week;
} _calendar_obj;
#endif





//=============================================================================
//帧的字节顺序
//=============================================================================
#define         HEAD_FIRST                    0
#define         HEAD_SECOND                   1
#define         PROTOCOL_VERSION              2
#define         SEQUENCEH                     3
#define         SEQUENCEL                     4
#define         FRAME_CMD                     5
#define         LENGTH                        6
#define         LENGTL                        7
#define         DATA_START                    8


//=============================================================================
//数据帧指令
//=============================================================================
#define         WAKEUP_CMD                      0                               //leokey_ble唤醒MCU心跳
#define         LEOKEY_BLE_ADV_CMD              0x01                            //leokey_ble广播控制

#define         LEOKEY_BLE_CFG_CMD              0x10                            //配置leokey_ble模块
#define         LEOKEY_BLE_MASTER_QUERY         0x11                            //主机查询Ble模块信息指令
#define         SET_TIMESTAMP_CMD               0x30                            //设置锁板MCU时间
#define         FACTORY_RESET_CMD               0x32                            //leokey_ble模块恢复出厂
#define         GET_USER_KEY                    0x33                            //获取蓝牙模块和APP绑定的UserKey用于计算临时密码



#define         PRODUCT_INFO_CMD                1                               //产品信息
#define         LEOKEY_BLE_STATE_CMD            2                               //leokey_ble工作状态	
#define         LEOKEY_BLE_DATA_REQ_CMD         4                               //leokey_ble数据下发命令
#define         DATA_REPORT_CMD                 5                               //MCU状态主动上报
#define         LEOKEY_BLE_NOTIFY_CMD           6                               //leokey_ble事物通知



//=============================================================================
#define LEAD_CODE_NUMBER        0x10                                            //前导码数
#define VERSION                 0x01                                            //协议版本号
#define PROTOCOL_HEAD           0x08                                            //固定协议头长度
//#define FIRM_UPDATA_SIZE        256                                           //升级包大小
#define FRAME_FIRST             0x55
#define FRAME_SECOND            0xaa



//============================================================================= 
extern volatile unsigned char leokey_ble_queue_buf[PROTOCOL_HEAD + LEOKEY_BLE_UART_QUEUE_LMT];        //串口队列缓存
extern volatile unsigned char leokey_ble_uart_rx_buf[PROTOCOL_HEAD + LEOKEY_BLE_UART_RECV_BUF_LMT];   //串口接收缓存
extern volatile unsigned char leokey_ble_uart_tx_buf[PROTOCOL_HEAD + LEOKEY_BLE_UART_SEND_BUF_LMT];   //串口发送缓存

extern volatile unsigned char   rx_in;          //接收字节标志
extern volatile unsigned short  rx_length;      //接收数据长度


#ifdef SUPPORT_MCU_RTC_CHECK
    extern unsigned char timestamp[4];    //时间戳
    extern _calendar_obj _time;           //storage time   
#endif


/*****************************************************************************
函数名称 : set_leokey_ble_uart_byte
功能描述 : 写leokey_ble_uart字节
输入参数 : dest:缓存区其实地址;
           byte:写入字节值
返回参数 : 写入完成后的总长度
*****************************************************************************/
unsigned short set_leokey_ble_uart_byte(unsigned short dest, unsigned char byte);


/*****************************************************************************
函数名称 : set_leokey_ble_uart_buffer
功能描述 : 写leokey_ble_uart_buffer
输入参数 : dest:目标地址
           src:源地址
           len:数据长度
返回参数 : 无
*****************************************************************************/
unsigned short set_leokey_ble_uart_buffer(unsigned short dest, unsigned char *src, unsigned short len);


/*****************************************************************************
函数名称 : leokey_ble_uart_write_frame
功能描述 : 向leokey_ble串口发送一帧数据
输入参数 : fr_type:帧类型
           len:数据长度
返回参数 : 无
*****************************************************************************/
void leokey_ble_uart_write_frame(unsigned char fr_cmd, unsigned short len);

void leokey_ble_uart_write_data(unsigned char *in, unsigned short len);

/*****************************************************************************
函数名称 : mcu_wakeup_leokey_ble
功能描述 : 唤醒leokey_ble模块函数
输入参数 : 无
返回参数 : 无
*****************************************************************************/
unsigned char mcu_wakeup_leokey_ble(void);
    

/*****************************************************************************
函数名称 : get_check_sum
功能描述 : 计算校验和
输入参数 : pack:数据源指针
           pack_len:计算校验和长度
返回参数 : 校验和
*****************************************************************************/
unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len);


/*****************************************************************************
函数名称 : data_handle
功能描述 : 数据帧处理
返回参数 : 无
*****************************************************************************/
int data_handle(void);



/*****************************************************************************
函数名称 : leokey_ble_factory_reset
功能描述 : leokey_ble模块恢复出厂，即删除已经绑定的UserKey
输入参数 : 无
返回参数 : 无
*****************************************************************************/
void leokey_ble_factory_reset(void);


/*****************************************************************************
函数名称  : mcu_disable_leokey_adv
功能描述  : 关闭leokey_ble广播
输入参数  : 无
返回参数  : 无
*****************************************************************************/
void mcu_disable_leokey_adv(void);


/*****************************************************************************
函数名称 : mcu_enable_add_leokey_adv
功能描述 : 使能添加广播
输入参数 : 无
返回参数 : 无
使用说明 : 让leokey_ble进入可添加状态，若已添加过，leokey_ble会忽略
*****************************************************************************/
void mcu_enable_add_leokey_adv(void);


/*****************************************************************************
函数名称 : mcu_enable_open_lock_leokey_adv
功能描述 : 使能开锁广播
输入参数 : 无
返回参数 : 无
使用说明 : 让leokey_ble进入可开锁状态，若未添加过APP，leokey_ble会忽略
*****************************************************************************/
void mcu_enable_open_lock_leokey_adv(void);

/*****************************************************************************
函数名称 : get_leokey_ble_user_key
功能描述 : UserKey 长度16字节
输入参数 : 无
返回参数 : 无
使用说明 : 获取蓝牙模块和APP绑定的UserKey用于计算临时密码
*****************************************************************************/
void get_leokey_ble_user_key(void);

void get_leokey_ble_mac_addr(void);

void get_leokey_ble_user_key_b(void);

void get_leokey_ble_soft_version(void);

/*****************************************************************************
函数名称 : Is_Leap_Year
功能描述 : 判断闰年/平年
输入参数 : pyear：年份
返回参数 : 1：闰年；0：平年
使用说明 : 调用该函数判断年份是否为闰年
*****************************************************************************/
static unsigned char Is_Leap_Year(unsigned int pyear);


/*****************************************************************************
函数名称 : RTC_Get
功能描述 : 计算时间
输入参数 : secCount：时间戳总秒数
           *calendar：时间结构体
返回参数 : 0：计算完成
使用说明 : 根据时间戳计算时间值
*****************************************************************************/
static unsigned char RTC_Get(unsigned int secCount, _calendar_obj *calendar);


/*****************************************************************************
函数名称 : leokey_ble_timestamp_to_time
功能描述 : 计算时间
输入参数 : *timestamp：云端下发时间戳值
返回参数 : 
使用说明 : 根据时间戳计算时间值
*****************************************************************************/
void leokey_ble_timestamp_to_time(void);    //(unsigned char *timestamp);



#ifdef SUPPORT_MCU_FIRM_UPDATE
/*****************************************************************************
函数名称 : assic_to_hex
功能描述 : ASSIC码转成hex
输入参数 : ASSIC值
返回参数 : 十进制值
使用说明 : 用于计算0~9的ASSIC
*****************************************************************************/
char assic_to_hex(unsigned char assic_num);


/*****************************************************************************
函数名称 : strcmp_barry
功能描述 : 比较字符串
输入参数 : *str1:字符串1
           *str2:字符串2
返回参数 : 比较结果
使用说明 : 比较字符串是否相等
*****************************************************************************/
int strcmp_barry(unsigned char *str1,unsigned char *str2);


#endif

#endif   /* _LEOKEY_BLE_SYSTEM_H_ */
  
  
